package com.zenithmind.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.user.pojo.domain.Tenant;
import com.zenithmind.user.pojo.dto.TenantCreateDTO;
import com.zenithmind.user.pojo.query.TenantQuery;
import com.zenithmind.user.pojo.vo.TenantVO;

import java.util.List;

/**
 * 租户服务接口
 * 
 * @author ZenithMind
 * @since 2024-06-30
 */
public interface TenantService extends IService<Tenant> {

    /**
     * 创建租户
     * 
     * @param createDTO 租户创建信息
     * @return 创建结果
     */
    Result<TenantVO> createTenant(TenantCreateDTO createDTO);

    /**
     * 分页查询租户
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<TenantVO> getTenantPage(TenantQuery query);

    /**
     * 根据ID获取租户详情
     * 
     * @param id 租户ID
     * @return 租户详情
     */
    TenantVO getTenantById(String id);

    /**
     * 根据租户编码获取租户
     * 
     * @param tenantCode 租户编码
     * @return 租户信息
     */
    TenantVO getTenantByCode(String tenantCode);

    /**
     * 更新租户信息
     * 
     * @param tenant 租户信息
     * @return 更新结果
     */
    Result<TenantVO> updateTenant(Tenant tenant);

    /**
     * 启用/禁用租户
     * 
     * @param id 租户ID
     * @param status 状态
     * @return 操作结果
     */
    Result<Void> updateTenantStatus(String id, Integer status);

    /**
     * 删除租户
     * 
     * @param id 租户ID
     * @return 删除结果
     */
    Result<Void> deleteTenant(String id);

    /**
     * 批量删除租户
     * 
     * @param ids 租户ID列表
     * @return 删除结果
     */
    Result<Void> deleteTenantBatch(List<String> ids);

    /**
     * 获取即将到期的租户
     * 
     * @return 即将到期的租户列表
     */
    List<TenantVO> getExpiringSoonTenants();

    /**
     * 获取已过期的租户
     * 
     * @return 已过期的租户列表
     */
    List<TenantVO> getExpiredTenants();

    /**
     * 更新租户用户数量
     * 
     * @param tenantId 租户ID
     * @param userCount 用户数量
     * @return 更新结果
     */
    boolean updateUserCount(String tenantId, Integer userCount);

    /**
     * 更新租户存储使用量
     * 
     * @param tenantId 租户ID
     * @param storageUsed 已用存储
     * @return 更新结果
     */
    boolean updateStorageUsed(String tenantId, Long storageUsed);

    /**
     * 增加租户存储使用量
     * 
     * @param tenantId 租户ID
     * @param increment 增量（可以为负数）
     * @return 更新结果
     */
    boolean incrementStorageUsed(String tenantId, Long increment);

    /**
     * 检查租户是否存在
     * 
     * @param tenantCode 租户编码
     * @return 是否存在
     */
    boolean existsByTenantCode(String tenantCode);

    /**
     * 检查租户状态是否有效
     * 
     * @param tenantId 租户ID
     * @return 是否有效
     */
    boolean isTenantValid(String tenantId);

    /**
     * 获取租户统计信息
     * 
     * @return 统计信息
     */
    TenantVO getTenantStats();
}
